package com.molichuxing.services.infrastructure.dao;

import java.util.List;
import java.util.Map;

import com.molichuxing.services.infrastructure.dto.response.CarAssetDto;
import org.apache.ibatis.annotations.Param;

import com.molichuxing.framework.dao.RootMapper;
import com.molichuxing.services.infrastructure.bean.CarBean;

/**
 * <p>
 * 车辆表 Mapper 接口
 * </p>
 *
 * @author
 * @since 2019-08-15
 */
public interface CarMapper extends RootMapper<CarBean> {

    /**
     * 根据车辆id查询车辆信息
     *
     * @param carId
     * @return
     */
    @Override
    public CarBean getById(@Param("carId") Integer carId);

    /**
     * 根据车辆id集合查询车辆信息
     *
     * @param carIds
     * @return
     */
    public List<CarBean> getByIds(@Param("carIds") List<Integer> carIds);

    /**
     * 根据vin查询车辆信息
     *
     * @param vin
     * @return
     */
    public CarBean getByVin(@Param("vin") String vin);

    /**
     * 根据vin和车牌查询车辆信息
     *
     * @param vin
     * @param licencePlate
     * @return
     */
    public CarBean getByVinLicencePlate(@Param("vin") String vin, @Param("licencePlate") String licencePlate);

    /**
     * 根据车牌和vin、运营状态查询车辆信息
     *
     * @param vin
     * @param licencePlate
     * @param status
     * @param stockId
     * @return
     */
    public List<CarBean> getCarListBySearch(@Param("vin") String vin, @Param("licencePlate") String licencePlate, @Param("status") Integer status, @Param("stockId") Integer stockId, @Param("carsType") Integer carsType);

    /**
     * 根据条件分页查询count
     *
     * @param map
     * @return
     */
    public int getCarPageCount(@Param("param") Map<String, Object> map);

    /**
     * 根据条件查询count
     *
     * @param plateStatus
     * @return
     */
    public int getCarCount(@Param("plateStatus") Integer plateStatus);

    /**
     * 根据条件分页查询结果
     *
     * @param map
     * @param pageNum
     * @param pageSize
     * @return
     */
    public List<CarBean> getCarPage(@Param("param") Map<String, Object> map, @Param("pageNum") int pageNum, @Param("pageSize") int pageSize);

    /**
     * 根据id编辑车牌信息
     *
     * @param carId
     * @param licencePlate
     * @param subcompanyId
     * @return
     */
    public int modifyLicencePlateById(@Param("carId") Integer carId, @Param("licencePlate") String licencePlate, @Param("subcompanyId") Integer subcompanyId);

    /**
     * 根据id编辑保险信息
     *
     * @param carId
     * @param compulsory
     * @param commercial
     * @return
     */
    public int modifyInsuranceById(@Param("carId") Integer carId, @Param("compulsory") Integer compulsory, @Param("commercial") Integer commercial);


    /**
     * 根据id编辑库存信息
     *
     * @param carId
     * @param stockId
     * @param stockType
     * @return
     */
    public int modifyStockIdById(@Param("carId") Integer carId, @Param("stockId") Integer stockId, @Param("stockType") Integer stockType);

    /**
     * 根据carId编辑车辆运营状态
     *
     * @param carId
     * @param status
     * @return
     */
    public int modifyStatusById(@Param("carId") Integer carId, @Param("status") Integer status);

    /**
     * 查询有效的车辆的数量
     *
     * @return
     */
    Integer getNoDeleteCarCount();

    /**
     * 新增车辆信息
     *
     * @param carBean
     * @return
     */
    public int createCar(CarBean carBean);

    /**
     * 根据仓库id，车型，车辆类型查询车辆信息
     *
     * @param stockId
     * @param vehicleId
     * @param carsType
     * @return
     */
    public List<CarBean> getSearchCarList(@Param("stockId") Integer stockId, @Param("vehicleId") Integer vehicleId, @Param("carsType") Integer carsType, @Param("carStatus") Integer carStatus);

    /**
     * 修改车辆状态
     *
     * @param carId
     * @param status
     * @param oldStatus
     * @return
     */
    public int modifyCarStatus(@Param("carId") Integer carId, @Param("status") Integer status,
                               @Param("oldStatus") Integer oldStatus);

    /**
     * 根据车辆类型获取车辆数量
     *
     * @param vehicleType
     * @return
     */
    public int getCarCountByType(@Param("vehicleType") Integer vehicleType);

    /**
     * 查询库存信息列表
     *
     * @param map
     * @param pageNum
     * @param pageSize
     * @return
     */
    public List<CarBean> getStockCarPage(@Param("param") Map<String, Object> map, @Param("pageNum") Integer pageNum, @Param("pageSize") Integer pageSize);

    /**
     * 查询库存信息列表数量
     *
     * @param map
     * @return
     */
    public int getStockCarPageCount(Map<String, Object> map);


    /**
     * 根据车辆业务类型查询车辆List
     *
     * @param businessType
     * @return
     */
    public List<CarBean> getCarsByBusinessType(@Param("businessType") Integer businessType);

    /**
     * 根据车辆业务类型查询车辆List
     *
     * @param businessTypeList
     * @return
     */
    public List<CarBean> getCarsByBusinessTypeList(@Param("businessTypeList") List<Integer> businessTypeList);

    /**
     * 修改车辆类型与车辆状态
     *
     * @param carId
     * @param carStatus
     * @param vehicleType
     * @return
     */
    public int modifyStatusAndVehicleTypeById(@Param("carId") Integer carId, @Param("status") Integer carStatus, @Param("vehicleType") Integer vehicleType);

    /**
     * 根据库存id和类型获取车辆数量
     *
     * @param stockIdList
     * @param stockType
     * @return
     */
    public List<Map<Object, Object>> getCarSumByStock(@Param("stockIdList") List<Integer> stockIdList, @Param("stockType") Integer stockType);

    /**
     * 车辆列表导出
     *
     * @param map
     * @return
     */
    public List<CarBean> getCarListDownload(@Param("param") Map<String, Object> map);

    public long getCarListDownloadCount(@Param("param") Map<String, Object> map);

    public int modify(CarBean bean);

    /**
     * 根据车辆vin集合查询车辆信息
     *
     * @param vinList
     * @return
     */
    public List<CarBean> getByVinList(@Param("vinList") List<String> vinList);

    /**
     * 车辆列表tab
     *
     * @return
     */
    public Map<String, Long> getCarTab();

    public Boolean modifyUseType(@Param("carId") Integer carId, @Param("status") Integer status, @Param("useType") Integer useType);

    /**
     * 全款买断车辆
     *
     * @return
     */
    public List<CarAssetDto> getFullBuyOut();
    /**
     * 运营车辆
     *
     * @return
     */
    public List<CarAssetDto> getOperatingVehicle();
    /**
     * 二次运营
     *
     * @return
     */
    public List<CarAssetDto> getSecondaryOperations();
    /**
     * 销售
     *
     * @return
     */
    public List<CarAssetDto> getSell();

    /**
     * 在库-实际在库
     *
     * @return
     */
    public List<CarAssetDto> getInStockActuallyInStock();

    /**
     * 在途车辆
     *
     * @return
     */
    public List<CarAssetDto> getInRoadVehicle();
    /**
     * 在库-诉讼中
     *
     * @return
     */
    public List<CarAssetDto> getInStockInLawsuit();


}
